package com.itany.corejava.code08_常用类.string;

/**
 * @author 石小俊
 * @version 1.0
 * @date 2023年03月15日 9:11
 */
public class Test01_创建方式 {
    public static void main(String[] args) {
        // 方式一:直接创建
        // 该方式本身来说不符合引用类型的特点,不符合面向对象的规范
        // 原则上来说,所有的引用数据类型必须通过关键字new来创建
        // 只有基本数据类型才可以直接赋值
        // String属于一种特殊的引用数据类型
        // 由于String太过于常用,JVM对其做了优化
        String s1 = "hello";
        String s2 = "hello";
        System.out.println(s1 == s2);

        // 方式二:使用构造方法创建
        // 创建一个空字符串
        String s3 = new String();
        // 通过byte数组创建,其值会被转换成char数组
        String s4 = new String(new byte[]{65, 66});
        // 通过char数组创建
        String s5 = new String(new char[]{'h', 'e', 'l', 'l', 'o'});
        // 直接通过字符串创建
        String s6 = new String("hello");
        System.out.println("s3:" + s3);
        System.out.println("s4:" + s4);
        System.out.println("s5:" + s5);
        System.out.println("s6:" + s6);

        // 空字符串与null的区别
        // 空字符串:在堆中分配了空间,空间中的值为空字符串
        String s7 = new String();
        // 在堆中没有分配空间
        String s8 = null;
        System.out.println(s7 == s8);
        // System.out.println(s8.equals(s7)); // 报错,NullPointerException
        System.out.println(s7.equals(s8));

        // 字符串拼接
        // 字符串类型与任何类型的拼接返回的都是字符串
        System.out.println(s6 + "world");
        System.out.println(s6 + 123);
        System.out.println(s6 + true);
    }

}
